主题
获取最后一次错误ID - GetLastError
函数简介
获取插件内部记录的最后一次错误ID,通常在某个接口调用失败后调用,用于诊断问题类型。
接口名称
GetLastErrorDLL调用
c
int GetLastError();参数说明
此函数无参数。
示例
SDK 调用
cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
int ret = ola.GetLastError();csharp
using OLAPlug;
var ola = new OLAPlugServer();
int ret = ola.GetLastError();python
from OLAPlugServer import OLAPlugServer
ola = OLAPlugServer()
ret = ola.GetLastError()java
import com.olaplug.OLAPlugServer;
OLAPlugServer ola = new OLAPlugServer();
int ret = ola.GetLastError();go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
ret := ola.GetLastError()rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let ret = ola.get_last_error();cpp
var ola = com("OlaPlug.OlaSoft")
var ret = ola.GetLastError()vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
ret = ola.GetLastError()text
.局部变量 ola, OLAPlug
ola.创建 ()
ret = ola.GetLastError()aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var ret = ola.GetLastError();text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
整数 ret = ola.GetLastError()cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
int32_t ret = ola.GetLastError();原生 DLL 调用
cpp
GetLastError(instance);csharp
using System.Runtime.InteropServices;
using System.Text;
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetLastError();
GetLastError(instance);python
from ctypes import CDLL, c_int, c_int64, create_string_buffer
ola = CDLL("OLAPlug_x64.dll")
ola.CreateCOLAPlugInterFace.restype = c_int64
ola.GetLastError(instance)返回值
返回值为错误码;0 表示无错误(SUCCESS)。BindWindow / AsmCall 等接口失败时还会在自身返回值中返回负数(绝对值与对应十进制错误码相同,如 BindWindow 返回 -4001、AsmCall 返回 -5005)。驱动内核错误码以有符号 int32 十进制返回(如 -1073741790、-536858608),请按下文「驱动内核错误」表的 十进制(int32) 列对照。
系统性错误(10xx)
| 错误码 | 常量名 | 说明 |
|---|---|---|
0 | SUCCESS | 操作成功 / 无错误 |
1001 | PERMISSION_DENIED | 权限不足,请检查 FeatureList |
1002 | NOT_AUTHORIZED | 未授权,请先登录 |
1003 | INVALID_ARGUMENT | 参数错误 |
1004 | VMWARE_PERMISSION_DENIED | VMware 权限不足 |
图像类错误(20xx)
| 错误码 | 常量名 | 说明 |
|---|---|---|
2001 | CAPTURE_ERROR | 截图失败 |
2002 | LOAD_IMAGE_ERROR | 加载图片失败 |
2003 | HWND_NOT_VALID | 窗口句柄无效 |
2004 | INVALID_HEX_COLOR_CODE | 无效的十六进制颜色代码 |
BindWindow / BindWindowEx 错误(40xx)
绑定失败时接口返回负数,GetLastError() 返回下表错误码(正整数)。完整说明与排查见 BindWindow 错误码说明。
| 错误码 | 常量名 | 说明 |
|---|---|---|
4001 | BIND_INVALID_HWND | 窗口句柄无效或已销毁 |
4002 | BIND_GET_PID_FAILED | 无法获取窗口所属进程 ID |
4003 | BIND_INVALID_MODE | display/mouse/keypad 模式无效 |
4004 | BIND_NOT_ELEVATED | 未以管理员权限运行 |
4010 | BIND_VNC_CONNECT_FAILED | VNC 中间件连接失败 |
4011 | BIND_RDP_CONNECT_FAILED | RDP 中间件连接失败 |
4020 | BIND_SHM_CREATE_FAILED | 创建/打开 Hook 共享内存失败 |
4021 | BIND_HOOK_UNLOAD_BUSY | 目标 Hook 仍在卸载中 |
4022 | BIND_MUTEX_CREATE_FAILED | 创建绑定互斥量失败 |
4023 | BIND_MUTEX_LOCK_TIMEOUT | 获取绑定互斥量超时 |
4024 | BIND_HEARTBEAT_CONFIG_FAILED | Hook 心跳/运行参数配置失败 |
4025 | BIND_DX3_IPC_PREP_FAILED | DX3 截图 IPC 预初始化失败 |
4030 | BIND_INJECT_FAILED | DLL 注入失败(通用) |
4031 | BIND_INJECT_MEMORY_LOAD_FAILED | 无痕内存注入失败 |
4032 | BIND_INJECT_REMOTE_EXE_FAILED | RemoteExe 注入失败 |
4033 | BIND_INJECT_REMOTE_THREAD_FAILED | 远程线程注入失败 |
4034 | BIND_INJECT_TEMP_DLL_WRITE_FAILED | 临时 Hook DLL 写入失败 |
4035 | BIND_INJECT_HELPER_EXPORT_FAILED | inject-helper 释出失败 |
4036 | BIND_INJECT_CREATE_PROCESS_FAILED | 启动 inject-helper 失败 |
4037 | BIND_INJECT_DLL_NOT_FOUND | Hook DLL 文件不存在 |
4038 | BIND_INJECT_DUP_MUTEX_BUSY | Hook 互斥量仍存在 |
4039 | BIND_INJECT_TIMEOUT | 注入后未检测到模块加载 |
4040 | BIND_INJECT_BUILTIN_DLL_DECODE_FAILED | 内置 hook_graphics 解码失败 |
4041 | BIND_INJECT_HELPER_NOT_FOUND | inject-helper 不存在 |
4042 | BIND_INJECT_OPEN_PROCESS_FAILED | OpenProcess 失败 |
4043 | BIND_INJECT_REFLECTIVE_FAILED | 反射注入失败 |
4044 | BIND_INJECT_DRIVER_FAILED | 驱动注入失败 |
4050 | BIND_HOOK_INIT_TIMEOUT | Hook 初始化超时 |
4099 | BIND_INTERNAL_EXCEPTION | 绑定内部异常 |
AsmCall 错误(50xx)
执行失败时接口返回负数,GetLastError() 返回下表错误码(正整数)。完整说明与排查见 AsmCall 错误码说明。
| 错误码 | 常量名 | 说明 |
|---|---|---|
5001 | ASM_INVALID_HWND | 窗口句柄无效(远程执行需有效 HWND) |
5002 | ASM_GET_PID_FAILED | 无法从窗口句柄获取进程 ID |
5003 | ASM_INVALID_TYPE | type 参数无效(有效范围 0~6) |
5004 | ASM_EMPTY_INPUT | 汇编输入为空 |
5005 | ASM_ASSEMBLE_FAILED | 汇编编译失败 |
5006 | ASM_INVALID_MACHINE_CODE | 机器码格式无效 |
5007 | ASM_PARSE_MACHINE_CODE_FAILED | 机器码解析失败 |
5008 | ASM_EMPTY_USER_CODE | 生成的用户代码为空 |
5009 | ASM_ALLOC_MEMORY_FAILED | 分配可执行内存失败 |
5010 | ASM_ADDRESS_SPACE_INSUFFICIENT | 指定地址空间不足 |
5011 | ASM_REASSEMBLE_FAILED | 按实际地址重新汇编失败 |
5012 | ASM_CODE_SIZE_EXCEEDED | 重编译后代码超出可用空间 |
5013 | ASM_CODE_REGION_OVERLAP | 代码区与标志区重叠 |
5014 | ASM_RIP_OFFSET_OUT_OF_RANGE | RIP 相对偏移超出有效范围 |
5015 | ASM_WRITE_MEMORY_FAILED | 写入目标进程内存失败 |
5016 | ASM_DEBUG_PRIVILEGE_FAILED | 无法启用调试权限 |
5017 | ASM_NULL_MEMORY_CLIENT | 内存客户端未初始化 |
5018 | ASM_INVALID_ENTRY_POINT | 执行入口地址无效 |
5019 | ASM_REMOTE_THREAD_FAILED | 创建远程线程失败 |
5020 | ASM_EVENT_CHANNEL_FAILED | 注入进程事件通道调用失败 |
5021 | ASM_MAIN_THREAD_CALL_FAILED | 主线程排队执行失败 |
5022 | ASM_DRIVER_CALL_FAILED | 驱动执行汇编失败 |
5023 | ASM_EXECUTION_TIMEOUT | 执行超时 |
5024 | ASM_READ_RETURN_VALUE_FAILED | 读取返回值失败 |
5098 | ASM_FAILED | AsmCall 失败(通用) |
5099 | ASM_INTERNAL_EXCEPTION | AsmCall 内部异常 |
驱动内核错误(30xx / NTSTATUS / ProtectFile / VT)
驱动内核模块相关接口失败时,可通过 GetLastError() 获取错误码;DriverTest、EnableVtDriver、ProtectFileTestDriver 的接口返回值本身即为错误码。
与 BindWindow / AsmCall 的十进制 40xx / 50xx 不同,驱动错误码在接口返回值中多为 有符号 int32 负数十进制(如 -1073741790、-536858608、-1058471934)。这与计算器按无符号 uint32 显示的正数(如 3236495362)是同一组 32 位,可用 unchecked((uint)ret) 还原十六进制。
完整码表(含 int32 / uint32 / 十六进制三列)见 驱动错误码说明 - DriverErrorCodes。
版本(30xx)
| 十进制(int32) | 十六进制 | 常量名 | 说明 |
|---|---|---|---|
3001 | — | DRIVER_VERSION_NOT_SUPPORTED | 驱动版本不支持 |
驱动通讯与内存(0xE000300x)
| 十进制(int32) | 十六进制 | 常量名 | 说明 |
|---|---|---|---|
-536858623 | 0xE0003001 | DRIVER_NO_PDB | PDB 解析失败 |
-536858622 | 0xE0003002 | DRIVER_NO_OPEN | 打开进程失败 |
-536858621 | 0xE0003003 | DRIVER_NO_HANDLE | 无效句柄 |
-536858620 | 0xE0003004 | DRIVER_NO_MEMORY_TYPE | 读写类型错误 |
-536858619 | 0xE0003005 | DRIVER_NO_ADDRESS | 地址错误 |
-536858618 | 0xE0003006 | DRIVER_NO_ADDRESS_SIZE | 超出范围 |
-536858617 | 0xE0003007 | DRIVER_NO_QUERMEMORY | 查询内存失败 |
-536858616 | 0xE0003008 | DRIVER_NO_ALLOCATE_MEMORY | 申请内存失败 |
-536858615 | 0xE0003009 | DRIVER_NO_OUTBUFF | 返回参数错误 |
-536858614 | 0xE000300A | DRIVER_NO_MAIN_THREAD | 获取主线程失败 |
-536858612 | 0xE000300C | DRIVER_NO_MODELE_ADDRESS | 获取模块地址失败 |
-536858611 | 0xE000300D | DRIVER_NO_READ_WRITE | 读写失败 |
-536858610 | 0xE000300E | DRIVER_NO_GETFUNC | 获取函数失败 |
-536858609 | 0xE000300F | DRIVER_NO_VERSION | 请更新版本 |
VT / EPT(0xE000301x,EnableVtDriver 常见)
| 十进制(int32) | 十六进制 | 常量名 | 说明 |
|---|---|---|---|
-536858608 | 0xE0003010 | OL_ERROR_VT_NOT_SUPPORTED | CPU 不支持 VT-x 虚拟化 |
-536858607 | 0xE0003011 | OL_ERROR_VT_DISABLED | VT-x 已被 BIOS 禁用 |
-536858606 | 0xE0003012 | OL_ERROR_VT_ALREADY_ENABLED | VT 已经启用(重复开启) |
-536858605 | 0xE0003013 | OL_ERROR_VT_ENABLE_FAILED | VT 开启失败 |
-536858604 | 0xE0003014 | OL_ERROR_VT_NOT_ENABLED | VT 未启用 |
-536858603 | 0xE0003015 | OL_ERROR_EPT_NOT_SUPPORTED | CPU 不支持 EPT |
-536858602 | 0xE0003016 | OL_ERROR_EPT_INIT_FAILED | EPT 初始化失败 |
更多 EPT / 保护 / 注入 / 通讯错误见 驱动错误码说明。
键鼠接口错误(驱动 Status / 60xx)
LeftDown / KeyDown / MoveTo 等键鼠接口失败时,接口返回值即为错误码:
SimModeType=4:透传驱动 Status(常见-536858583键鼠未初始化、-536858582发送失败;驱动加载失败时亦可能为-1058471934/0xC0E90002等 NTSTATUS)。- VNC/RDP/虚拟机通道未就绪:返回
-6001(KEYMOUSE_BACKEND_UNAVAILABLE),GetLastError()为6001。 - 参数非法(未知按键名等):返回
-1003(INVALID_ARGUMENT)。
完整驱动码表见 驱动错误码说明。
驱动加载 NTSTATUS(0xC000xxxx / 0xC0E9xxxx)
| 十进制(int32) | 十进制(uint32) | 十六进制 | 常量名 | 说明 |
|---|---|---|---|---|
-1073741823 | 3221225473 | 0xC0000001 | DRIVER_UNSUCCESSFUL | 驱动加载失败,无法具体定位原因 |
-1073741790 | 3221225506 | 0xC0000022 | DRIVER_ACCESS_DENIED | 权限不足,通常需要管理员或 SYSTEM 权限 |
-1073741772 | 3221225524 | 0xC0000034 | DRIVER_OBJECT_NAME_NOT_FOUND | 注册表路径不存在 |
-1073741771 | 3221225525 | 0xC0000035 | DRIVER_OBJECT_NAME_COLLISION | 注册表项或对象名冲突 |
-1073741766 | 3221225530 | 0xC000003A | DRIVER_OBJECT_PATH_NOT_FOUND | 注册表路径无效 |
-1073741727 | 3221225569 | 0xC0000061 | DRIVER_PRIVILEGE_NOT_HELD | 缺少 SeLoadDriverPrivilege 权限 |
-1073741701 | 3221225595 | 0xC000007B | DRIVER_INVALID_IMAGE_FORMAT | 驱动文件格式不正确(如 32/64 位不匹配) |
-1073741670 | 3221225626 | 0xC000009A | DRIVER_INSUFFICIENT_RESOURCES | 系统资源不足 |
-1073741210 | 3221226086 | 0xC0000266 | DRIVER_INTERNAL_ERROR | 驱动初始化失败,DriverEntry 出错 |
-1058471934 | 3236495362 | 0xC0E90002 | DRIVER_SYSTEM_INTEGRITY_POLICY_VIOLATION | 系统完整性策略拦截(HVCI/内存完整性、Smart App Control、驱动签名/代码完整性等阻止驱动加载) |
文件保护驱动 ProtectFile(0xDFDFD00x)
| 十进制(int32) | 十六进制 | 常量名 | 说明 |
|---|---|---|---|
-538980351 | 0xDFDFD001 | DRIVER_PF_ERROR_ERROR | 未知错误 |
-538980350 | 0xDFDFD002 | DRIVER_PF_ERROR_NO_OPEN | 打开进程失败 |
-538980349 | 0xDFDFD003 | DRIVER_PF_ERROR_NO_HANDLE | 无效句柄 |
-538980348 | 0xDFDFD004 | DRIVER_PF_ERROR_INVALID_PARAM | 参数错误 |
-538980347 | 0xDFDFD005 | DRIVER_PF_ERROR_PATH_TOO_LONG | 路径过长 |
其他
| 错误码 | 常量名 | 说明 |
|---|---|---|
9999 | UNKNOWN_ERROR | 未知错误 |
注意事项
| 项目 | 说明 |
|---|---|
| 调用时机 | 一般在接口调用失败后立即调用;中间再次调用其他接口可能覆盖错误状态。 |
| 配合使用 | 可配合 GetLastErrorString 获取中文错误描述。 |
| BindWindow | 失败返回负数,详见 BindWindow 错误码说明。 |
| AsmCall | 失败返回负数;成功返回 EAX/RAX(可为 0)。详见 AsmCall 错误码说明。 |
| 驱动内核 | 错误码以 十进制 int32 返回(常见负数);完整十进制/十六进制对照见 驱动错误码说明。 |
| 键鼠接口 | SimModeType=4 透传驱动 Status;通道未就绪返回 -6001;参数非法返回 -1003。 |
